# 什么是LEGB，请解释

"""
LEGB 是 Python 中描述变量作用域的一个缩写，它表示 Local、Enclosing、Global 和 Built-in 四个作用域。这四个作用域按照查找变量的顺序，从内到外依次是：
    - Local（局部）：指的是在函数或方法内部定义的变量。这个作用域只在函数内部有效，超出函数范围就不能访问了。
    - Enclosing（嵌套）：指的是包含在函数中的函数的作用域。如果在一个函数内部定义了另一个函数，那么内部函数就处于嵌套作用域，可以访问外部函数的变量。
    - Global（全局）：指的是在模块（文件）级别定义的变量，也就是在所有函数之外定义的变量。全局变量可以在模块中的任何地方访问。
    - Built-in（内置）：指的是 Python 内置的函数名和关键字等，例如 print()、len() 等。这个作用域是最外层的作用域，包含了所有的内置函数和关键字。

当在代码中引用一个变量时，Python 解释器会按照 LEGB 的顺序依次查找变量的定义。首先在局部作用域查找，然后是嵌套作用域，接着是全局作用域，最后是内置作用域。一旦找到了匹配的变量，查找就会停止。

这种作用域规则有助于理解变量在不同部分的可见性，也有助于避免命名冲突。如果在局部作用域有一个同名的变量，那么它会覆盖全局作用域的同名变量。如果需要在函数内部使用全局变量，可以使用 global 关键字声明。
"""

# 全局作用域
global_variable = "I am a global variable"


def outer_function():
    # 嵌套作用域
    outer_variable = "I am an outer variable"

    def inner_function():
        # 局部作用域
        local_variable = "I am a local variable"
        print(local_variable)  # I am a local variable
        print(outer_variable)  # I am an outer variable
        print(global_variable)  # I am a global variable

    inner_function()


# 调用外部函数
outer_function()

# 在全局作用域访问全局变量
print(global_variable)  # I am a global variable

# 尝试在全局作用域访问局部变量和内部函数的变量（会引发错误）
print(local_variable)  # NameError: name 'local_variable' is not defined.
print(outer_variable)  # NameError: name 'outer_variable' is not defined
